<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /*
      JS垃圾回收机制
        在 JS 中对象的释放（回收）是靠浏览器中的垃圾回收器来回收处理的
        1. 垃圾回调器（GC）

        - 浏览器中有个专门的线程， 它每隔很短的时间就会运行一次
        - 主要工作：判断一个对象是否是垃圾对象，如果是，清除其内存数据，并标记内存是空闲状态

        2. 引用计数法
        有计数器来记录对象的引用次数，如果对象又被引用记录1，没有被引用记录0，后面将计数0的对象清除

        3. 标记清除法（主流）
        标记阶段：如果对象又被引用，就会打上标记，如果对象没有被引用，就会标记垃圾对象
        清除阶段：将没有被引用的垃圾对象清除
        
        问题：
          - 内存碎片化
          - 分配内存慢

        4. 标记整理法
        标记阶段：如果对象又被引用，就会打上标记，如果对象没有被引用，就会标记垃圾对象
        整理阶段：将被引用的对象往内存的一端移动，剩下的内存清除

        5. 新老生区
        将内存分为新生代内存区和老生代内存区

        新生代内存区：放存活时间短和体积较小的对象
        老生代内存区：放存活时间长和体积较大的对象

        新老生区分别有两个垃圾回收器去处理

        新生代内存区：将内存一分为二，分为使用区和空闲区，默认对象进入使用区，
        当开启垃圾回收时，将使用区被引用对象复制到空闲区，将使用区内容清空，将空限区变成使用区，使用区变成空闲区
        有两个特殊情况：
          1. 如果对象经过多次垃圾回收周期还存活，就会进入老生代内存区
          2. 如果对象体积超过20%，也会进入老生代内存区

        老生代内存区：标记整理法
    */

  </script>
</body>
</html>